/*
 Copyright (c) 2013 MeherTJ G. All rights reserved.
 License: LGPL for personnal study or free software.
 */

#pragma once
#include <cassert>
#include <memory>

namespace Zen {

	class Abstract
	{
	public:
		virtual ~Abstract() = default;
	};
	
	class Uncopyable
	{
	public:
		Uncopyable() = default;
		Uncopyable(Uncopyable const &) = delete;
		void operator = (Uncopyable const &) = delete;
	};
}

#define ZEN_GET_SET_REF(Type, mName, GetName, SetName) \
public: Type const & GetName() const { return mName; } \
public: void SetName(Type const & v) { this->mName= v; } \
protected: Type mName 

#define ZEN_GET_SET_COPY(Type, mName, GetName, SetName) \
public: Type GetName() const { return mName; } \
public: void SetName(Type v) { this->mName= v; } \
protected: Type mName 

